// function createIterator (items) {
//   var i = 0;
//   return {
//     next: function () {
//       var done = i >= items.length
//       var value = !done ? items[i++] : undefined
//       return {
//         done: done,
//         value: value
//       }
//     }
//   }
// }

// var iterator = createIterator([1, 2, 3])
// console.log(iterator.next()) // { done: false, value: 1 }
// console.log(iterator.next()) // { done: false, value: 2 }
// console.log(iterator.next()) // { done: false, value: 3 }
// console.log(iterator.next()) // { done: true, value: undefined }

// 生成器
// function *createIterator () {
//   yield 1
//   yield 2
//   yield 3
// }
// // 生成器的返回的是一个迭代器
// const iterator = createIterator()
// console.log(iterator.next()) // { done: false, value: 1 }
// console.log(iterator.next()) // { done: false, value: 2 }
// console.log(iterator.next()) // { done: false, value: 3 }
// console.log(iterator.next()) // { done: true, value: undefined }

// function *createIterator (items) {
//   for (let i = 0; i < items.length; i ++) {
//     yield items[i]
//   }
// }
// const iterator = createIterator([1, 2, 3])
// console.log(iterator.next()) // { done: false, value: 1 }
// console.log(iterator.next()) // { done: false, value: 2 }
// console.log(iterator.next()) // { done: false, value: 3 }
// console.log(iterator.next()) // { done: true, value: undefined }

// const createIterator = function *(items) {
//   for (let i = 0; i < items.length; i ++) {
//     yield items[i]
//   }
// }
// const iterator = createIterator([1, 2, 3])

// const obj = {
//   createIterator: function *(items) {
//     for (let i = 0; i < items.length; i ++) {
//       yield items[i]
//     }
//   }
// }
// const iterator = obj.createIterator([1, 2, 3])
// console.log(iterator.next()) // { done: false, value: 1 }
// console.log(iterator.next()) // { done: false, value: 2 }
// console.log(iterator.next()) // { done: false, value: 3 }
// console.log(iterator.next()) // { done: true, value: undefined }

// const values = [1, 2, 3]
// for (const iterator of values) {
//   console.log(iterator)
// }
// 1
// 2
// 3

// const values = [1, 2, 3]
// const iterator = values[Symbol.iterator]()
// console.log(iterator.next()) // { done: false, value: 1 }
// console.log(iterator.next()) // { done: false, value: 2 }
// console.log(iterator.next()) // { done: false, value: 3 }
// console.log(iterator.next()) // { done: true, value: undefined }

// function isIteratorable (obj) {
//   return typeof obj[Symbol.iterator] === 'function'
// }
// const values = [1, 2, 3]
// console.log(isIteratorable(values)) // true

// let collection = {
//   items: [],
//   *[Symbol.iterator] () {
//     for (let item of this.items) {
//       yield item
//     }
//   }
// }

// collection.items.push(1)
// collection.items.push(2)
// collection.items.push(3)

// for (let x of collection) {
//   console.log(x)
// }
// 1
// 2
// 3

// let colors = ['red', 'yellow', 'blue']
// console.log(colors.entries().next()) // { value: [ 0, 'red' ], done: false }
// for (let entry of colors.entries()) {
//   console.log(entry)
// }
// // [ 0, 'red' ]
// // [ 1, 'yellow' ]
// // [ 2, 'blue' ]

// const set = new Set([123, 222, 333])
// for (let entry of set.entries()) {
//   console.log(entry)
// }
// // [ 123, 123 ]
// // [ 222, 222 ]
// // [ 333, 333 ]


// const map = new Map()
// map.set('name', '周芷若')
// map.set('sex', '女')
// for (let entry of map.entries()) {
//   console.log(entry)
// }
// // [ 'name', '周芷若' ]
// // [ 'sex', '女' ]


// let colors = ['red', 'yellow', 'blue']
// const set = new Set([123, 222, 333])
// const map = new Map()
// map.set('name', '周芷若')
// map.set('sex', '女')
// for (let entry of colors.values()) {
//   console.log(entry)
// }

// for (let entry of set.values()) {
//   console.log(entry)
// }

// for (let entry of map.values()) {
//   console.log(entry)
// }

// red
// yellow
// blue
// 123
// 222
// 333
// 周芷若
// 女


// let colors = ['red', 'yellow', 'blue']
// const set = new Set([123, 222, 333])
// const map = new Map()
// map.set('name', '周芷若')
// map.set('sex', '女')
// for (let entry of colors.keys()) {
//   console.log(entry)
// }

// for (let entry of set.keys()) {
//   console.log(entry)
// }

// for (let entry of map.keys()) {
//   console.log(entry)
// }

// 0
// 1
// 2
// 123
// 222
// 333
// name
// sex

// var message = '你好啊 我的小公举'
// for (let c of message) {
//   console.log(c)
// }
// 你
// 好
// 啊
 
// 我
// 的
// 小
// 公
// 举

// const divs = document.getElementsByTagName('div')
// for (let div of divs) {
//   console.log(div.id)
// }

// function *createIterator () {
//   let first = yield 1
//   let second = yield first + 2
//   yield second + 3
// }

// const iterator = createIterator()
// console.log(iterator.next()) // { value: 1, done: false }
// console.log(iterator.next(2)) // { value: 4, done: false }
// console.log(iterator.next(3)) // { value: 6, done: false }
// function *createIterator () {
//     yield 1
//     yield 2
//     return 4
//     yield 3
// }
// const iterator = createIterator()
// console.log(iterator.next()) // { value: 1, done: false }
// console.log(iterator.next()) // { value: 2, done: false }
// console.log(iterator.next()) // { value: 4, done: true }

function *createNumberIterator () {
    yield 1
    yield 2
    return 3
}
function *createColorIterator (num) {
  yield 'red' + num
  yield 'blue' + num
}

function *createIterator () {
  const num = yield *createNumberIterator()
  yield *createColorIterator(num)
  yield true
  yield num
}

const iterator = createIterator()
console.log(iterator.next()) // { value: 1, done: false }
console.log(iterator.next()) // { value: 2, done: false }
console.log(iterator.next()) // { value: 'red3', done: false }
console.log(iterator.next()) // { value: 'blue3', done: false }
console.log(iterator.next()) // { value: true, done: false }
console.log(iterator.next()) // { value: 3, done: false }
